﻿namespace Blip.JSONParser
{
    using System.Collections.Generic;
    using System.Text;
    using System.Text.RegularExpressions;

    /// <summary>
    /// Konwertuje wartości typu string do wymaganego formatu.
    /// </summary>
    public static class Converter
    {
        private static IDictionary<string, string> table = new Dictionary<string, string>();

        static Converter()
        {
            Add(@"\u00a3", "£");
            Add(@"\u00a5", "¥");
            Add(@"\u00a6", "¦");
            Add(@"\u00a7", "§");
            Add(@"\u00a9", "©");
            Add(@"\u00ab", "«");
            Add(@"\u00ae", "®");
            Add(@"\u00b6", "¶");
            Add(@"\u00bb", "»");
            Add(@"\u00d3", "Ó");
            Add(@"\u00f3", "ó");
            Add(@"\u0104", "Ą");
            Add(@"\u0105", "ą");
            Add(@"\u0106", "Ć");
            Add(@"\u0107", "ć");
            Add(@"\u0118", "Ę");
            Add(@"\u0119", "ę");
            Add(@"\u0141", "Ł");
            Add(@"\u0142", "ł");
            Add(@"\u0143", "Ń");
            Add(@"\u0144", "ń");
            Add(@"\u015a", "Ś");
            Add(@"\u015b", "ś");
            Add(@"\u0179", "Ź");
            Add(@"\u017a", "ź");
            Add(@"\u017b", "Ż");
            Add(@"\u017c", "ż");
            Add(@"\u003C", "<");
            Add(@"\u003E", ">");
            Add(@"\u0026", "&");
            Add(@"\u2026", "...");
            Add(@"\u00a0", " ");
        }

        private static void Add(string a, string b)
        {
            table.Add(a, b);
        }

        /// <summary>
        /// Przeprowadza operację konwersji podanego łańcucha znaków.
        /// </summary>
        /// <param name="text">Łańcuch znakowy poddawany konwersji</param>
        /// <returns>Skonwertowany łańcuch znaków</returns>
        public static string Convert(string text)
        {
            StringBuilder sb = new StringBuilder(text);
            foreach (var key in table.Keys)
                sb.Replace(key, table[key]);

            var regex = new Regex(@"\\([\000\010\011\012\015\032\042\047\134\140])", RegexOptions.IgnoreCase);
            return regex.Replace(sb.ToString(), @"$1");
        }
    }
}
